package com.bana.fvs.utils;

import com.alibaba.fastjson.JSON;
import com.bana.fvs.code.SystemLogType;
import com.bana.fvs.model.FogArea;
import com.bana.sys.service.LogService;
import com.bana.sys.utils.Token;
import org.springframework.stereotype.Component;

import javax.websocket.OnClose;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 * 通知雾区方案websocket
 */
@ServerEndpoint(value = "/websocket/fogArea")
@Component
public class FogAreaServer {

    /**
     * 客户端集合
     */
    private static CopyOnWriteArraySet<FogAreaServer> webSocketSet = new CopyOnWriteArraySet<>();

    /**
     * 发送session
     */
    private Session session;


    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        webSocketSet.add(this);
    }

    @OnClose
    public void onClose() {
        webSocketSet.remove(this);
    }

    /**
     * 发送到客户端
     * @param json 发送内容
     */
    private void send(String json)  {

        try
        {
            this.session.getBasicRemote().sendText(json);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

    }

    /**
     * 发送到全部客户端
     * @param fogArea 雾区信息
     */
    public static void sendAll(LogService logService,FogArea fogArea,String source){

        String log=String.format(
                "雾区%s 实际状态-控制源:%s(%d) 雾灯状态:%s(%d)\n平台控制-控制模式:%s(%d) 控制策略:%s(%d) 雾灯状态:%s(%d)\n能见度:%d\n来源：%s"

                ,fogArea.getWqmc()
                ,fogArea.getControllers_zt().isEmpty()?"-":fogArea.getControllers_zt().get(0).getKzysm()
                ,fogArea.getControllers_zt().isEmpty()?-1:fogArea.getControllers_zt().get(0).getKzy()
                ,fogArea.getControllers_zt().isEmpty()?"-":fogArea.getControllers_zt().get(0).getWdkzsm()
                ,fogArea.getControllers_zt().isEmpty()?-1:fogArea.getControllers_zt().get(0).getWdkz()

                ,fogArea.getGzmssm()
                ,fogArea.getGzms()
                ,fogArea.getKzclsm()
                ,fogArea.getKzcl()
                ,fogArea.getWdkzsm()
                ,fogArea.getWdkz()
                ,fogArea.getNjd()

                ,source
        );
        logService.insertSystemLog(Token.SystemToken,SystemLogType.NoticeFogarea,log,null);
        String json= JSON.toJSONString(fogArea);
        for (FogAreaServer server : webSocketSet) {
            server.send(json);
        }
        FogAreaServer_out.sendAll(fogArea);

    }

}
